package furns.web;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.lang.reflect.Method;


public abstract class BasicServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解决接收到的数据中文乱码问题
        request.setCharacterEncoding("utf-8");

        //老韩提示：如果我们使用了模板模式+反射+动态绑定，要满足action的value 和 方法名一致!!!
        //获取表单中的 name = "action" 的value值  即 <input type="hidden" name="action" value="save">
        String action = request.getParameter("action");
        //使用反射,获取当前对象的方法
        //老韩解读
        //1.this 就是表单中action请求的Servlet。例： <form action="manage/furnServlet" method="post"> 中的 manage/furnServlet
        //2.declaredMethod 方法对象就是当前请求的furnServlet对应的"action名字" 的方法（即save）,
        //  该方法对象(declaredMethod)是根据用户请求动态变化的
        //3. 老韩的体会：使用模板模式 + 反射 + 动态机制 ===> 简化多个 if--else if---..
        try {
            /** 参数说明：
             * 如：protected void login(HttpServletRequest request, HttpServletResponse response)
             * action：指定反射的furnServlet类中的方法名。在上述代码中，action = save
             * HttpServletRequest.class、HttpServletResponse.class：action所表示的方法中的参数类型
             * 流程：首先得到 this 这个类的类加载路径，然后得到该类中指定的方法声明
             */
            Method declaredMethod =
                    this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
//            System.out.println("declaredMethod=" + declaredMethod);
            //使用方法对象，进行反射调用。this 表示当前反射类的实例对象
            declaredMethod.invoke(this, request, response);

        } catch (Exception e) {
            //java基础->异常机制
            //将发生的异常,继续throw
            //老师心得体会: 异常机制是可以参与业务逻辑
            //老师把这个问题，暴露出来的，让你们看到. 让小伙伴学到东西.
            throw new RuntimeException(e);

        }
    }

    //在BasicServlet中, 增加处理Get请求
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}